// 导入类模块
import WxRequest from 'mina-request'

// 导入本地存储的方法
import { getStorage, clearStorage } from './storage'

// 导入增强的方法
import { toast, model } from './extendApi'

// 导入环境变量中的基地址
import {env} from './env'

// 创建实例
const instance = new WxRequest({
  baseURL: env.baseURL,
  timeout: 5000
})

// 请求拦截器
instance.interceptors.request = (config) => {
  // 需要鉴权的接口

  // 从本地获取存储的token
  const token = getStorage('token')
  // 如果本地存在token，需要在请求头中添加token字段
  if (token) {
    config.header['token'] = token
  }

  return config
}
// 响应拦截器
instance.interceptors.response = async (response) => {
  // 解构response
  const { isSuccess, data } = response
  // 请求成功的处理：

  // 需要对状态码进行判断
  // 1）200为成功
  // 2）208为token失效或没有token，需要给出模态框的提示，然后跳转到登录页面
  // 3）不是200也不是208，需要提示错误信息
  if (isSuccess) {
    switch (data.code) {
      case 200:
        // 1）请求成功，返回数据
        return data
      case 208:
        // 2）token失效或没有token，需要给出模态框的提示，然后跳转到登录页面
        // 模态框的提示
        const res = await wx.model({
          content: '登录已失效，请重新登录',
          showCancel: false
        })
        if (res == true) {
          // 清除之前存储的用户信息，跳转到用户登录页
          clearStorage()
          wx.navigateTo({
            url: '/pages/login/login'
          })
        }
        // 208是异常，需要promise抛出异常
        return Promise.reject(response)

      default:
        wx.toast({
          title: '程序出现异常，请联系客服或稍后重试'
        })
        return Promise.reject(response)
    }
  }

  // 请求失败的处理
  //   失败的原因是网络出现了问题，需要给出消息提示toast
  if (!isSuccess) {
    wx.toast({
      title: '网络异常请重试',
      icon: 'error'
    })
    return response
  }
 
}

// 导出实例
export default instance
